<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>字典</h1>
<script>

    class Dictionary{ // 字典
        constructor() {
            this.table = {}
        }
        // 对所有的key值都过一遍 变成字符串
        toStrFn(item){
            if(item === null){
                return 'null'
            }else if(item === undefined){
                return "undefined"
            }else if(typeof item === 'string' || item instanceof String){
                return item
            }
            return JSON.stringify(item)
        }
        hasKey(key){ // 有木有键
            return this.table[this.toStrFn(key)] != null
            // undefined == null // true
            // null == null // true
        }

        set(key, value){
            if(key != null && value != null){
                this.table[this.toStrFn(key)] = new ValuePair(key,value) // 防止key丢失 我们把值设置成对象
                return true
            }
            return false
        }
        get(key){
            let res = this.table[this.toStrFn(key)]
            return res == null ? undefined : res.value
            // 或者
            /*
            * return this.table[this.toStrFn(key)]?.value
            * */
        }
        remove(key){ // 删除属性
            if(this.toStrFn(key)){
                delete this.table[this.toStrFn(key)]
                return true
            }
            return false
        }
        // 返回所有的key
        keys(){
            return this.keyValues().map(item=>{
                return item.key
            })
        }

        // 返回所有的value
        values(){
            return this.keyValues().map(item=>{
                return item.key
            })
        }
        // key value 都返回
        keyValues(){
            return Object.values(this.table)
        }
        size(){
            return this.keyValues().length
        }

        isEmpty(){
            return this.size() === 0
        }
        clear(){
            this.table = {}
        }
        // 提供一个遍历方法
        forEach(cb){
            let keyValue = this.keyValues()
            for(let i=0;i<keyValue.length;i++){
                cb(keyValue[i].key,keyValue[i].value)
            }
        }

    }
    class ValuePair{
        constructor(key,value) {
            this.key = key
            this.value = value
        }
    }
    let myData = new Dictionary()
    myData.set('name','aaaaa')
    myData.set({a:1},'bbbb')
    myData.forEach((item,value)=>{
        console.log(item,value)
    })
</script>
</body>
</html>
